/**
 * @PROJECT_NAME design_patterns
 * @DESCRIPTION 抽象工厂模式
 * 抽象工厂模式是一种访问类提供一个创建一组相关或者相互依赖对象的接口，且访问类无需指定所要产品的具体类就能得到同族的不同等级的产品的模式结构，
 * 抽象工厂模式是工厂方法模式的升级版本，工厂方法模式只生产一个等级的产品，而且抽象工厂模式可生产多个等级的产品。
 * <p>
 * 抽象工厂（Abstract Factory）：提供了创建产品的接口，它包含多个创建产品的方法，可以创建多个不同等级的产品。
 * <p>
 * 具体工厂（Concrete Factory）：主要是实现抽象工厂中的多个抽象方法，完成具体产品的创建。
 * <p>
 * 抽象产品（Abstract Product）：定义了产品的规范，描述了产品的主要特性和功能，抽象工厂模式有多个抽象产品。
 * <p>
 * 具体产品（Concrete Product）：实现了抽象产品角色所定义的接口，由具体工厂来创建，它同具体工厂之间是多对一的关系。
 * <p>
 * 案例场景：
 * 当咖啡店业务发生改变，不仅要生产咖啡还要生产甜点，如提拉米苏，抹茶慕斯等，要是按照工厂方法模式。
 * 需要定义提拉米苏，抹茶慕斯类，提拉米苏工厂、抹茶慕斯工厂、甜点工厂等，很容易发生类爆炸情况。
 * 其中拿铁咖啡，美式咖啡是一个产品等级，都是咖啡；提拉米苏。抹茶慕斯也是一个产品等级。
 * 拿铁咖啡喝提拉米苏是同一产品族（也就是都属于意大利风味），美式咖啡和抹茶慕斯是统一产品族（也就是都属于美式风味）
 * 所以这个案例可以使用抽象工厂模式实现。
 * <p>
 * 优点：
 * <p>
 * 当一个产品族的多个对象被设计成一起工作时，他能保证客户端始终只使用同一个产品族中的对象
 * <p>
 * 缺点：
 * <p>
 * 当产品族中需要添加一个新的产品时，所有的工厂类都需要进行修改。如加一个汉堡，则需要对所有的工厂类都改一遍。
 * <p>
 * 使用场景：
 * 当需要创建的对象是一系列相互关联或相互依赖的产品族时，如电器工厂中的电视机，洗衣机，空调等。
 * 系统中有多个产品族，但每次只使用其中的某一组产品，如有人只喜欢穿某一个品牌的衣服和鞋子。
 * 系统中提供了产品的类库，且所有产品的接口相同，客户端不依赖产品实例的创建细节和内部结构
 * 如手机的主题切换功能，切换后，界面，图标大小样式，字体样式都会发生变化
 * @AUTHOR CNBruceLee
 * @DATE 2021/7/11 13:24
 */
package com.bruce.demo2.patterns.demo1.creational.demo03.abstractFactory;
